package main

import (
	"fmt"
)

type J struct {
	N
}

type N struct {
	int
}

func (t N) testN() {
	fmt.Println("如类型 J 包含匿名字段 *N，则 J 和 *J 方法集包含 N 方法")
}
func (t *N) testP() {
	fmt.Println("如类型 J 包含匿名字段 *N，则 J 和 *J 方法集包含 *N 方法")
}

// 如类型 J 包含匿名字段 `*N`，则 J 和 `*J` 方法集包含 `N + *N` 方法
func main() {
	s1 := J{N{1}}
	s2 := &s1
	fmt.Printf("s1 is : %v\n", s1) // s1 is : {{1}}
	s1.testN()                     // 如类型 J 包含匿名字段 *N，则 J 和 *J 方法集包含 N 方法
	s1.testP()                     // 如类型 J 包含匿名字段 *N，则 J 和 *J 方法集包含 *N 方法
	fmt.Printf("s2 is : %v\n", s2) // s2 is : &{{1}}
	s2.testN()                     // 如类型 J 包含匿名字段 *N，则 J 和 *J 方法集包含 N 方法
	s2.testP()                     // 如类型 J 包含匿名字段 *N，则 J 和 *J 方法集包含 *N 方法
}
